#============================================================
#	Timer Task
#============================================================
#  计时器任务
# * 到达时间进行调用目标对象的方法
#============================================================
# @datetime: 2022-5-4 20:39:14
#============================================================

class_name TimerTask
extends Node


signal executed(target, method)


var _tasks := {}


#============================================================
#   内置
#============================================================
func _ready():
	set_process(_tasks.size() > 0)


func _process(delta: float):
	for task in _tasks.keys():
		if task.sub_time(delta):
			task.execute()
			emit_signal("executed", task.target, task.method)
			_tasks.erase(task)
			set_process(_tasks.size() > 0)


#============================================================
#   自定义
#============================================================
##  添加任务
## @time  倒计时时间
## @target  目标
## @method  调用方法
## @binds  
func add_task(
	time: float, 
	target: Object, 
	method: String, 
	binds: Array = []
):
	_tasks[Task.new(time, target, method, binds)] = null
	set_process(true)


#============================================================
#   任务类
#============================================================
class Task:
	var time : float
	var target:Object
	var method: String
	var arg_array: Array = []
	
	func _init(
		_time: float, 
		_target:Object, 
		_method: String, 
		_arg_array: Array = []
	):
		time = _time
		target = _target
		method = _method
		arg_array = _arg_array
	
	func sub_time(t: float) -> bool:
		time -= t
		return time <= 0.0
	
	# 执行任务
	func execute():
		target.callv(method, arg_array)


